package com.example.demo.shiro;

import com.example.demo.entity.TUser;
import org.apache.shiro.authc.AuthenticationException;
import org.apache.shiro.authc.AuthenticationInfo;
import org.apache.shiro.authc.AuthenticationToken;
import org.apache.shiro.authc.SimpleAuthenticationInfo;
import org.apache.shiro.authz.AuthorizationInfo;
import org.apache.shiro.authz.SimpleAuthorizationInfo;
import org.apache.shiro.realm.AuthorizingRealm;
import org.apache.shiro.subject.PrincipalCollection;
import org.springframework.stereotype.Component;

/**
 * @Classname MyRealm
 * @Description 3: 自定义realm
 * @Date 2019/10/23 9:37
 * @Created by yby
 */
//@Component
public class MyRealm extends AuthorizingRealm {

    //注释：
    //当密码验证通过后，就到了我们的自定义realm，在我们自定义realm中实现了AuthorizingRealm接口，将其方法进行重写，将各种权限对用户进行授权，
    //同时对用户身份进行验证，代码如下，每一行代码具体含义十分详细了。

    /*@Autowired
    UserService us;*/

    //【授权】  角色权限和对应权限添加 Authorization授权 将数据库中的角色和权限授权给输入的用户名。
    @Override
    protected AuthorizationInfo doGetAuthorizationInfo(PrincipalCollection principalCollection) {
        //获取登录的用户名
        String phone =(String)principalCollection.getPrimaryPrincipal();
        //到数据库里查询要授权的内容
        //User user = us.querybyname(phone);
        //记住用户所有的登录权限
        SimpleAuthorizationInfo simpleAuthorizationInfo = new SimpleAuthorizationInfo();
        /*for(Role r:user.getRoles()){
            //将所有的角色信息添加进来。
            simpleAuthorizationInfo.addRole(r.getRname());
            for(Permission p:r.getPermissions()){
                //将此次遍历到的角色的所有权限拿到，添加·进来
                simpleAuthorizationInfo.addStringPermission(p.getPname());
            }
        }*/
        return simpleAuthorizationInfo;
    }

    //【认证】 用户身份验证
    @Override
    protected AuthenticationInfo doGetAuthenticationInfo(AuthenticationToken authenticationToken) throws AuthenticationException {

        //从token获取用户名,从主体传过来的认证信息中获取
        //加这一步的目的是在post请求时会先进入认证然后再到请求。
        if(null == authenticationToken.getPrincipal()){
            return null;
        }
        //获取用户的登录信息
        String phone = authenticationToken.getPrincipal().toString();
        //根据service调用用户名，查找用户的全部信息
        //通过用户名到数据库获取凭证
        //User user=us.querybyname(phone);
        TUser user=new TUser();
        if(user==null){
            //这里返回会报出对应异常
            return  null;
        }else{
            //这里验证authenticationToken和simpleAuthenticationInfo的信息
            SimpleAuthenticationInfo simpleAuthenticationInfo=new SimpleAuthenticationInfo(phone,user.getLogin_pass().toString(),getName());
            return simpleAuthenticationInfo;
        }
    }
}
